Skip to content

fix(install): name the non-interactive trigger in the --station-deepseek conflict error (#7009) - #7013

Closed
yanyunl1991 wants to merge 1 commit into
mainfrom
fix/7009-name-noninteractive-trigger
Closed

fix(install): name the non-interactive trigger in the --station-deepseek conflict error (#7009)#7013
yanyunl1991 wants to merge 1 commit into
mainfrom
fix/7009-name-noninteractive-trigger

Conversation

@yanyunl1991

@yanyunl1991 yanyunl1991 commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Summary

When --station-deepseek conflicts with non-interactive mode, the installer printed the same error regardless of what caused it, so users following the documented install could not tell why the flag was rejected:

[ERROR] --station-deepseek selects the DGX Station express prompt and cannot be combined with --non-interactive.

main() exports NON_INTERACTIVE into NEMOCLAW_NON_INTERACTIVE, so the origin cannot be recovered at error time.

Fix

Record the trigger during flag parsing and name it in the message:

... cannot be combined with non-interactive mode (triggered by: the --non-interactive flag).
... cannot be combined with non-interactive mode (triggered by: NEMOCLAW_NON_INTERACTIVE=1).

The (triggered by: …) clause is appended only when the origin is known, so direct callers that set NON_INTERACTIVE without going through flag parsing still get a clean message.

Verification (DGX-Station-mocked aarch64)

  • --non-interactive + --station-deepseek → names the --non-interactive flag.
  • NEMOCLAW_NON_INTERACTIVE=1 + --station-deepseek → names NEMOCLAW_NON_INTERACTIVE=1.

Updated/added cases in test/install-express-prompt.test.ts (the harness sources the real installer, so these run the actual shell logic).

Relationship to #7008

Companion to #7008, which stops NEMOCLAW_ACCEPT_THIRD_PARTY_SOFTWARE=1 from implying non-interactive for --station-deepseek. Kept as a separate PR per issue. This PR touches only the trigger tracking and the error message (flag parsing + the validator), not the accept-notice block that #7008 changes, so the two PRs do not overlap and can merge in either order. Once #7008 lands, notice acceptance is no longer a trigger here, and the remaining triggers (the flag and env var) are both named.

Fixes #7009.

Signed-off-by: Yanyun Liao yanyunl@nvidia.com

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Bug Fixes
    • Improved conflict messages when DeepSeek station selection is combined with non-interactive mode.
    • Error messages now identify whether non-interactive mode was enabled by the command-line flag or environment setting.

…eek conflict error (#7009)

When --station-deepseek conflicts with non-interactive mode, the error printed an
identical message no matter what caused it, so users could not tell why it was
rejected. main() exports NON_INTERACTIVE into NEMOCLAW_NON_INTERACTIVE, so the origin
cannot be recovered at error time.

Record the trigger during flag parsing and name it in the message:

  ... cannot be combined with non-interactive mode (triggered by: the --non-interactive flag).
  ... cannot be combined with non-interactive mode (triggered by: NEMOCLAW_NON_INTERACTIVE=1).

The "(triggered by: ...)" clause is only appended when the origin is known, so direct
callers that set NON_INTERACTIVE without going through flag parsing still get a clean
message.

Companion to #7008 (which stops notice acceptance from implying non-interactive for
--station-deepseek); kept as a separate PR per issue. This PR touches only the trigger
tracking and the error message, not the decouple, so the two do not overlap.

Signed-off-by: Yanyun Liao <yanyunl@nvidia.com>
@coderabbitai

coderabbitai Bot commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

The installer now records whether non-interactive mode came from the command-line flag or environment and includes that source in Station DeepSeek conflict errors. Tests cover both trigger sources and generic non-interactive mode messaging.

Changes

Station DeepSeek trigger reporting

Layer / File(s) Summary
Track non-interactive mode source
scripts/install.sh
Argument parsing records --non-interactive, and environment-enabled mode defaults to NEMOCLAW_NON_INTERACTIVE=1.
Report and validate conflict source
scripts/install.sh, test/install-express-prompt.test.ts
Conflict errors include the recorded trigger, with expectations covering flag, environment, and generic non-interactive cases.

Estimated code review effort: 2 (Simple) | ~10 minutes

Possibly related issues

  • NVIDIA/NemoClaw issue 7008 — Both changes address --station-deepseek conflicts caused by inferred non-interactive mode.

Possibly related PRs

  • NVIDIA/NemoClaw#7010 — Updates the same installer source tracking, conflict messaging, and corresponding tests.

Suggested labels: area: install, platform: dgx-station

Suggested reviewers: ericksoa, sandl99

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Linked Issues check ⚠️ Warning The PR only reports --non-interactive and NEMOCLAW_NON_INTERACTIVE=1, but the linked issue requires naming NEMOCLAW_ACCEPT_THIRD_PARTY_SOFTWARE=1. Add conflict reporting for NEMOCLAW_ACCEPT_THIRD_PARTY_SOFTWARE=1, or explicitly document and link the separate change that covers that implicit trigger.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title is specific and accurately describes the main installer error-message change.
Out of Scope Changes check ✅ Passed The changes stay focused on non-interactive trigger reporting and matching test updates.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/7009-name-noninteractive-trigger

Comment @coderabbitai help to get the list of available commands.

@github-code-quality

github-code-quality Bot commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Overview

Languages: TypeScript

TypeScript / code-coverage/plugin

The overall coverage remains at 96%, unchanged from the main branch.

TypeScript / code-coverage/cli

The overall coverage in the fix/7009-name-nonint... branch remains at 80%, unchanged from the main branch.

Show a code coverage summary of the most impacted files.
File main b528371 fix/7009-name-nonint... 1b2bbcf +/-
src/lib/domain/.../connect-env.ts 97% 89% -8%
src/lib/onboard...corporate-ca.ts 100% 92% -8%
src/lib/onboard...host-anchors.ts 94% 90% -4%
src/lib/actions...eway-restart.ts 93% 90% -3%
src/lib/onboard...u-patch-mode.ts 93% 90% -3%
src/lib/inference/local.ts 82% 80% -2%
src/lib/onboard...tch-recreate.ts 95% 94% -1%
src/lib/messagi...flow-planner.ts 93% 93% 0%
src/lib/actions...ess-recovery.ts 77% 78% +1%
src/lib/onboard...box-prebuild.ts 69% 88% +19%

Updated July 16, 2026 10:17 UTC
Code Coverage is in Public Preview. Learn more and provide us with your feedback.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@test/install-express-prompt.test.ts`:
- Line 369: Strengthen the fallback assertion in the NON_INTERACTIVE case of the
install-express prompt test by anchoring the expected message ending or matching
the complete message, ensuring it cannot match text containing a “(triggered by:
…)” suffix. Preserve the test’s validation of the direct-caller fallback
contract.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 7d901185-b4db-4b0d-acef-cb33be462d7d

📥 Commits

Reviewing files that changed from the base of the PR and between b528371 and 1b2bbcf.

📒 Files selected for processing (2)
  • scripts/install.sh
  • test/install-express-prompt.test.ts

it.each([
["NEMOCLAW_NO_EXPRESS", "1", /cannot be combined with NEMOCLAW_NO_EXPRESS=1/],
["NON_INTERACTIVE", "1", /cannot be combined with --non-interactive/],
["NON_INTERACTIVE", "1", /cannot be combined with non-interactive mode/],

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Make the fallback assertion prove that no trigger is included.

The current unanchored regex matches both the generic message and a message containing (triggered by: ...). Anchor the expected ending or assert the complete message so this test protects the direct-caller fallback contract.

Suggested fix
-    ["NON_INTERACTIVE", "1", /cannot be combined with non-interactive mode/],
+    ["NON_INTERACTIVE", "1", /cannot be combined with non-interactive mode\.$/],
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
["NON_INTERACTIVE", "1", /cannot be combined with non-interactive mode/],
["NON_INTERACTIVE", "1", /cannot be combined with non-interactive mode\.$/],
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@test/install-express-prompt.test.ts` at line 369, Strengthen the fallback
assertion in the NON_INTERACTIVE case of the install-express prompt test by
anchoring the expected message ending or matching the complete message, ensuring
it cannot match text containing a “(triggered by: …)” suffix. Preserve the
test’s validation of the direct-caller fallback contract.

Source: Path instructions

@github-actions

github-actions Bot commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

PR Review Advisor — Blocking findings reported

Advisor assessment: Blockers require maintainer review
Next action: Review the blockers below.
Findings: 1 blocker · 0 warnings · 0 suggestions

Model lanes

  • GPT-5.6 Terra (primary): Completed · high confidence · 1 blocker · 0 warnings · 0 suggestions
  • Nemotron 3 Ultra (second opinion): Completed · high confidence · 1 blocker · 0 warnings · 0 suggestions
  • Model comparison: normalized findings differ; normalized E2E selections differ; severity counts match.

Nemotron output stays in workflow artifacts and does not change the assessment above.

E2E guidance

Advisory only. E2E / PR Gate selects and runs jobs independently.

Recommended E2E: cloud-onboard

Blockers

PRA-1 Blocker — Name the acceptance env var that enabled non-interactive mode

  • Location: scripts/install.sh:3157
  • Category: acceptance
  • Problem: The new provenance field is assigned for the flag and NEMOCLAW_NON_INTERACTIVE paths, but the subsequent NEMOCLAW_ACCEPT_THIRD_PARTY_SOFTWARE transition sets NON_INTERACTIVE=1 without assigning NON_INTERACTIVE_SOURCE. Consequently, --station-deepseek with only NEMOCLAW_ACCEPT_THIRD_PARTY_SOFTWARE=1 still produces the generic error, not the source-specific remediation required by [DGX Station][CLI&UX] --station-deepseek non-interactive error omits NEMOCLAW_ACCEPT_THIRD_PARTY_SOFTWARE=1 as implicit trigger #7009.
  • Impact: Users following the documented non-interactive acceptance pattern cannot determine from the preflight error that NEMOCLAW_ACCEPT_THIRD_PARTY_SOFTWARE=1 caused the conflict, so the reported installer failure remains unresolved.
  • Fix: When the acceptance branch changes NON_INTERACTIVE from unset to 1, assign NON_INTERACTIVE_SOURCE to NEMOCLAW_ACCEPT_THIRD_PARTY_SOFTWARE=1; retain the existing earlier flag/env attribution when non-interactive was already set.
  • Verification: Read scripts/install.sh main(): invoke it on a DGX Station with --station-deepseek and NEMOCLAW_ACCEPT_THIRD_PARTY_SOFTWARE=1, then inspect the conflict message before ensure_docker is reached.
  • Test coverage: Extend the existing preflight parameterized test with NEMOCLAW_ACCEPT_THIRD_PARTY_SOFTWARE=1 and --station-deepseek; assert the error names that env var and the mutation log remains empty.
  • Evidence: scripts/install.sh:3142-3146 records only --non-interactive and NEMOCLAW_NON_INTERACTIVE as sources. scripts/install.sh:3157 sets NON_INTERACTIVE=1 for accepted third-party software without assigning NON_INTERACTIVE_SOURCE. Issue [DGX Station][CLI&UX] --station-deepseek non-interactive error omits NEMOCLAW_ACCEPT_THIRD_PARTY_SOFTWARE=1 as implicit trigger #7009, authored by a COLLABORATOR, explicitly requires identifying NEMOCLAW_ACCEPT_THIRD_PARTY_SOFTWARE=1 as the implicit non-interactive trigger.

Workflow run details

This automated review informs maintainers. Warnings and suggestions do not require a response. A maintainer decides whether to merge.

@yanyunl1991

Copy link
Copy Markdown
Contributor Author

Consolidating back into a single combined PR #7010 (covers both #7008 and #7009). Closing this split.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[DGX Station][CLI&UX] --station-deepseek non-interactive error omits NEMOCLAW_ACCEPT_THIRD_PARTY_SOFTWARE=1 as implicit trigger

2 participants